package com.en.effectiveJava.chapter1;

/**
 * 测试内部类/文件类/成员类等
 * * * * * * *
 * Test 为主类，或者可以称为 top level class,
 *  一个.java文件只允许有一个以 public 修饰的 top level class
 * Create by EN
 * On 21/05/18 4:13 PM
*/
public class Test {

    {
        /**
         * 局部类(local nested class)
         *  即块/方法 内的嵌套类，只能为内部类，且最多被 final 修饰
         *
         */
        class BlockClass {

            public void sing() {
                System.out.printf("I like singing!\n");
            }

        }
    }

    private String name;

    private Integer age;

    public void descripMe() {
        System.out.printf("My Name is %s, I'm %d! \n", name, age);
    }

    /**
     * 内部类(inner class)
     *  非静态嵌套类都可称为内部类
     *  初始化内部类时带有主类的引用
     *  因此可以直接调用主类的方法和属性
     */
    public class InnerTest {

        private String name;

        public void call() {
            descripMe();
            /**
             * 当内部类和外部类的属性名相同时，直接调用是当前内部类的属性
             * 若调用外部类的属性，属性前需要加 (外部类名.this.)
             */
            System.out.printf("I'm %s!\n", name);
            System.out.printf("I'm %s!\n", Test.this.name);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    /**
     * 静态嵌套类
     *  可以理解为和主类同级别的类，不需要实例化主类即可实例
     *  不能访问主类的方法属性，不常用
     */
    public static class StaticTest {

        private String sex;

        public void call() {
            System.out.printf("I'm a %s!\n", sex);
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

/**
 * 外部类，文件类
 *  一个.java文件只能有一个public修饰的外部类
 *  默认的包访问权限
*/
class FileClass {

    public static final String appearance = "beautiful";

}